/*
解题思路:《算法笔记上机指南》
1.开数组a[],用来存放对应指数的系数。 例如a[e]就是指数为e的项的系数
2.使用while...EOF的格式来读取系数和指数
3.从低次项至高次项进行枚举 求导公式  a[i-1] = a[i] * i
4.最后从高次项到低次项进行枚举

⚠️ 1. 对0次项的求导需要特判直接为0
⚠️ 2. 如果求导之后没有任何非零项，需要输出0 0
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
// a[N]用来存放指数为N的系数
int a[N];
int main()
{
    // k为系数，e为指数，count计数为不为0的导数项的个数
    int k, e, count = 0;
    while(scanf("%d%d", &k, &e) != EOF)
    {
        a[e] = k;
    }
    // 0次求导为0
    a[0] = 0; 
    for(int i = 1; i < N; i ++)
    {
        a[i - 1] = a[i] * i; // 求导公式
        a[i] = 0; // a[i] = 0 是什么意思 ？如果不设置为0的话就会被计入结果。
        if(a[i - 1] != 0) count ++;
    }
    if(count == 0) printf("0 0"); // 特判
    else {
        for(int i = 1000; i >= 0; i --) {
            // 从高到低输出
            if(a[i] != 0)
            {
                printf("%d %d", a[i], i);
                count --;
                if(count != 0) printf(" ");
            }
        }
    }
    return 0;
}